package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.service.GoodsTypeService;
import com.google.gson.JsonObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {

    @Autowired
    private GoodsTypeDao goodsTypeDao;

    // 查询所有商品分类
    @Override
    public List<Map> loadGoodsType() {
        // 获得商品分类集合
        List<GoodsType> goodsTypeList = goodsTypeDao.getGoodsTypeList();
        // 声明一个JsonObject集合
        List<Map> list = new ArrayList<>();
        // 取出商品分类集合中的pId集合，用于后续判断是否有子分类
        Map<Integer, GoodsType> goodsTypeMap = goodsTypeList.stream().collect(Collectors.toMap(GoodsType::getGoodsTypeId, goodsType -> goodsType));
        Integer rootId = null;
        for (GoodsType goodsType : goodsTypeList) {
            if(goodsType.getPId() == -1){
                rootId = goodsType.getGoodsTypeId();
            }
        }
        if(rootId != null){
            Map map = loadGoodsType(1, goodsTypeList, goodsTypeMap);
            list.add(map);
        }
        return list;

        /*
         "id": 1,
        "text": "所有类别",
        "state": "closed",
        "iconCls": "goods-type",
        "attributes": {
            "state": 1
        },
        "children":

         */
    }

    // 新增分类
    @Override
    @Transactional
    public void save(String goodsTypeName, Integer pId) {
        goodsTypeDao.saveGoodsType(goodsTypeName,pId);
        GoodsType goodsType = goodsTypeDao.getGoodsTypeById(pId);
        goodsType.setGoodsTypeState(1);
        goodsTypeDao.updateGoodsTypeState(goodsType);
    }

    // 删除分类
    @Override
    @Transactional
    public void delete(Integer goodsTypeId) {
        GoodsType goodsType = goodsTypeDao.getGoodsTypeById(goodsTypeId);
        Integer pId = goodsType.getPId();
        // 删除当前分类
        goodsTypeDao.deleteById(goodsTypeId);
        // 查询所删除分类的父分类是否有其他分类
        List<GoodsType> list = goodsTypeDao.selectChilds(pId);
        if(list == null || list.size() == 0){
            // 无其他子分类，改变状态为0，即变成叶子节点
            GoodsType parenrtGoodTypeForUpdate = new GoodsType();
            parenrtGoodTypeForUpdate.setGoodsTypeId(pId);
            parenrtGoodTypeForUpdate.setGoodsTypeState(0);
            goodsTypeDao.updateGoodsTypeState(parenrtGoodTypeForUpdate);
        }
    }

    public Map loadGoodsType(Integer goodsTypeId, List<GoodsType> goodsTypeList, Map<Integer, GoodsType> goodsTypeMap){
        Map<String, Object> map = new HashMap<>();
        map.put("id",goodsTypeId);
        map.put("text",goodsTypeMap.get(goodsTypeId).getGoodsTypeName());
        if(goodsTypeMap.get(goodsTypeId).getGoodsTypeState() == 0){
            map.put("state","open");
        }else {
            map.put("state","closed");
        }

        map.put("iconCls","goods-type");
        Map<String, Object> stateMap = new HashMap<>();
        stateMap.put("state",goodsTypeMap.get(goodsTypeId).getGoodsTypeState());
        map.put("attributes",stateMap);
        if(goodsTypeMap.get(goodsTypeId).getGoodsTypeState() == 0){
            return map;
        }
        List<Map<String,Object>> list = new ArrayList<>();
        for (GoodsType goodsType : goodsTypeList) {
            if(goodsType.getPId() == goodsTypeId){
                Map child = loadGoodsType(goodsType.getGoodsTypeId(), goodsTypeList, goodsTypeMap);
                list.add(child);
            }
        }
        map.put("children",list);

        return map;
    }
}
